1Writer Cycle Bullet 3
< || >
2024-10-12
空行の場合も動くようにした
code:js
// 選択されている行の範囲を取得
let selectedRange = editor.getSelectedLineRange();
if (!selectedRange) {
ui.alert("Error", "No lines are selected.");
return;
}
// 元の選択範囲を保持
let originalSelection = editor.getSelectedRange();
// 選択されている行のテキストを取得
let selectedText = editor.getTextInRange(selectedRange0, selectedRange1);
// 各行ごとに処理を行うため、改行で分割
let lines = selectedText.split('\n');
// 処理前の全テキストの長さを保持(元の文字数を計算)
let originalLength = selectedText.length;
// 各行に対して処理を行う
let processedLines = lines.map(line => {
line = line.trimStart(); // 行頭の空白を除去
// 行頭の状態を確認し、次のステップに切り替え
if (line.startsWith('- x ')) {
// チェックボックス完了 -> 行頭なし
return line.replace('- x ', '');
} else if (line.startsWith('- ')) {
// チェックボックス未完了 -> チェックボックス完了
return line.replace('- ', '- x ');
} else if (line.startsWith('- ')) {
// 箇条書き -> チェックボックス未完了
return line.replace('- ', '- ');
} else if (line.trim() === '') {
// 空行 -> 箇条書き
return '- ';
} else {
// 行頭なし -> 箇条書き
return '- ' + line;
}
});
// 変換後の全テキストを再構築
let newText = processedLines.join('\n');
// 処理後の全テキストの長さを計算
let newLength = newText.length;
// 文字数の差分を計算
let lengthDifference = newLength - originalLength;
// テキストをエディタに反映
editor.replaceTextInRange(selectedRange0, selectedRange1, newText);
// 選択範囲があるかどうかの判定
if (originalSelection0 === originalSelection1) {
// 選択範囲がない(カーソル位置だけの場合)
let newCursorPos = originalSelection0 + lengthDifference;
editor.setSelectedRange(newCursorPos, newCursorPos); // カーソル位置のみを設定
} else {
// 選択範囲がある場合は、範囲を復元
let newSelectionStart = originalSelection0;
let newSelectionEnd = originalSelection1 + lengthDifference;
editor.setSelectedRange(newSelectionStart, newSelectionEnd); // 選択範囲を復元
}